// 导入必要的库和模块
package co.yixiang.common.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import co.yixiang.common.service.BaseService;
import co.yixiang.common.web.param.OrderQueryParam;
import co.yixiang.common.web.param.QueryParam;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;

import java.util.Arrays;
import java.util.List;

/**
 * 抽象基础服务实现类，提供通用的增删查改操作
 * @param <M> 数据访问层接口类型
 * @param <T> 实体类型
 */
@Slf4j
@SuppressWarnings("unchecked")
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements BaseService<T> {

    /**
     * 根据查询参数设置分页信息
     * @param queryParam 查询参数对象，包含页码和每页记录数等信息
     * @return 初始化后的分页对象
     */
    protected Page setPageParam(QueryParam queryParam) {
        return setPageParam(queryParam,null);
    }

    /**
     * 根据查询参数和默认排序设置分页信息
     * @param queryParam 查询参数对象，包含页码和每页记录数等信息
     * @param defaultOrder 默认的排序规则
     * @return 初始化后的分页对象
     */
    protected Page setPageParam(QueryParam queryParam, OrderItem defaultOrder) {
        Page page = new Page();
        // 设置当前页码
        page.setCurrent(queryParam.getPage());
        // 设置页大小
        page.setSize(queryParam.getLimit());
        /**
         * 如果是queryParam是OrderQueryParam，并且不为空，则使用前端排序
         * 否则使用默认排序
         */
        if (queryParam instanceof OrderQueryParam){
            OrderQueryParam orderQueryParam = (OrderQueryParam) queryParam;
            List<OrderItem> orderItems = orderQueryParam.getOrders();
            if (CollectionUtil.isEmpty(orderItems)){
                page.setOrders(Arrays.asList(defaultOrder));
            }else{
                page.setOrders(orderItems);
            }
        }else{
            page.setOrders(Arrays.asList(defaultOrder));
        }

        return page;
    }

    /**
     * 根据Spring Data的Pageable对象设置分页信息
     * @param pageable Spring Data的分页对象，包含页码、每页记录数和排序信息
     */
    protected void getPage(Pageable pageable) {
        String order=null;
        if(pageable.getSort()!=null){
            order= pageable.getSort().toString();
            order=order.replace(":","");
            if("UNSORTED".equals(order)){
                order="id desc";
            }
        }
        PageHelper.startPage(pageable.getPageNumber()+1, pageable.getPageSize(),order);
    }

}
